package com.secret.dao;

import org.hibernate.Criteria;

import java.io.Serializable;
import java.util.List;

/**
 * 基础数据库操作类
 * 
 * @author hysd
 * 
 */
public interface BaseDao<T> {
	
	/**
	 * 保存一个对象
	 * 
	 * @param o
	 * @return
	 */
	public Serializable save(T o);

	/**
	 * 批处理，保存List对象，每次保存 500 条刷新
	 * @param list
	 * @return
	 */
	public void saveBatch(List<T> list);

	/**
	 * 删除一个对象
	 * 
	 * @param o
	 */
	public void delete(T o);

	public void deleteBatch(List<T> list);
	/**
	 * 更新一个对象
	 * 
	 * @param o
	 */
	public void update(T o);

	/**
	 * 保存或更新对象
	 * 
	 * @param o
	 */
	public void saveOrUpdate(T o);

	/**
	 * 查询
	 * 
	 * @param hql
	 * @return
	 */
	public List<T> find(String hql);

	/**
	 * 查询集合
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public List<T> find(String hql, Object[] param);

	/**
	 * 查询集合
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public List<T> find(String hql, List<Object> param);

	/**
	 * 查询集合(带分页)
	 * 
	 * @param hql
	 * @param param
	 * @param page
	 *            查询第几页
	 * @param rows
	 *            每页显示几条记录
	 * @return
	 */
	public List<T> find(String hql, Object[] param, Integer page, Integer rows);

	/**
	 * 查询集合(带分页)
	 * 
	 * @param hql
	 * @param param
	 * @param page
	 * @param rows
	 * @return
	 */
	public List<T> find(String hql, List<Object> param, Integer page,
                        Integer rows);

	/**
	 * 获得一个对象
	 * 
	 * @param c
	 *            对象类型
	 * @param id
	 * @return Object
	 */
	public T get(Class<T> c, Serializable id);

	/**
	 * 获得一个对象
	 * 
	 * @param hql
	 * @param param
	 * @return Object
	 */
	public T get(String hql, Object[] param);

	/**
	 * 获得一个对象
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public T get(String hql, List<Object> param);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @return
	 */
	public Long count(String hql);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Long count(String hql, Object[] param);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Long count(String hql, List<Object> param);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @return 响应数目
	 */
	public Integer executeHql(String hql);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @param param
	 * @return 响应数目
	 */
	public Integer executeHql(String hql, Object[] param);


	public void executeSql(String sql);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeHql(String hql, List<Object> param);
	
	
	public List<T> find(Criteria cr, Integer page, Integer rows);


	/**
	 * sql查询返回List<Object[]>
	 * 每一个Object[]代表一条数据
	 */
	public List<Object[]> getBySqlObject(String sql);

    /**
     * 通过sql 查询实体
     * @param sql
     * @param c 类的实例
     * @return
     */
	public List<T> getBySql(String sql, Class<T> c);

    /***
     * 通过sql 查询实体
     * @param sql
     * @param param
     * @param c 类的实例
     * @return
     */
	public List<T> getBySql(String sql, Object[] param, Class<T> c);


    /**
     * 通过sql 分页 查询实体
     * @param sql
     * @param param
     * @param page
     * @param rows
     * @param c 类的实例
     * @return
     */
    public List<T> getBySql(String sql, Object[] param, Integer page, Integer rows, Class<T> c);
}
